package pt.iscte.dcti.es.rhplus.servico;

import java.sql.Date;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Hashtable;

import pt.iscte.dcti.es.rhplus.sistema.persistencia.AcessoBD;

/**
 * 
 * @author Gustavo Cabral
 * @author Helena Monteiro
 * @author Joao Catarino
 * @author Tiago Moreiras
 */
public class Comparticipacao {

	/** Creates a new instance of Comparticipacao */
	public Comparticipacao(final int id_servico, final int id_empresa, final double percentagem, final Date data) {

		this.id_empresa = id_empresa;
		this.id_servico = id_servico;
		this.percentagem = percentagem;
		this.data = data;
	}

	public static void insere(final Hashtable<String, Object> dados_da_comparticipacao) throws SQLException, ClassNotFoundException,
			InstantiationException, IllegalAccessException {

		AcessoBD acesso_bd = new AcessoBD();
		acesso_bd.carregaDriverEAbreLigacao();
		String qryName = new String("inserir_comparticipacao");
		acesso_bd.executaUpdate(qryName, dados_da_comparticipacao);
		acesso_bd.fechaLigacao();

	}

	public static void altera(final Hashtable<String, Object> dados_da_comparticipacao) throws SQLException, ClassNotFoundException,
			InstantiationException, IllegalAccessException {

		AcessoBD acesso_bd = new AcessoBD();
		acesso_bd.carregaDriverEAbreLigacao();
		String qryName = new String("alterar_comparticipacao");
		acesso_bd.executaUpdate(qryName, dados_da_comparticipacao);
		acesso_bd.fechaLigacao();

	}

	public static Comparticipacao devolve(final int id_servico, final int id_empresa) throws SQLException, ClassNotFoundException,
			InstantiationException, IllegalAccessException {

		// Consulta a BD
		AcessoBD acesso_bd = new AcessoBD();
		acesso_bd.carregaDriverEAbreLigacao();
		String qryName = new String("devolver_comparticipacao");
		Hashtable<String, Object> dados_da_comparticipacao = new Hashtable<String, Object>();
		dados_da_comparticipacao.put("var_id_servico", new Integer(id_servico));
		dados_da_comparticipacao.put("var_id_empresa", new Integer(id_empresa));
		ResultSet result_set = acesso_bd.executaSelect(qryName, dados_da_comparticipacao);

		if (result_set.next()) {
			// Cria o servico generico
			Date data = result_set.getDate("data");
			double percentagem = result_set.getDouble("percentagem");

			acesso_bd.fechaLigacao();

			Comparticipacao comparticipacao = new Comparticipacao(id_servico, id_empresa, percentagem, data);

			return comparticipacao;
		} else
			return null;
	}

	public static boolean existe(final int id_servico, final int id_empresa) throws SQLException, ClassNotFoundException, InstantiationException,
			IllegalAccessException {

		return Comparticipacao.devolve(id_servico, id_empresa) != null;
	}

	public static void remove(final int id_servico, final int id_empresa) throws SQLException, ClassNotFoundException, InstantiationException,
			IllegalAccessException {

		AcessoBD acesso_bd = new AcessoBD();
		acesso_bd.carregaDriverEAbreLigacao();
		String qryName = new String("remover_comparticipacao");
		Hashtable<String, Object> dados_da_comparticipacao = new Hashtable<String, Object>();
		dados_da_comparticipacao.put("var_id_servico", new Integer(id_servico));
		dados_da_comparticipacao.put("var_id_empresa", new Integer(id_empresa));

		acesso_bd.executaUpdate(qryName, dados_da_comparticipacao);
		acesso_bd.fechaLigacao();

	}

	public int getIdServico() {
		return id_servico;
	}

	public int getIdEmpresa() {
		return id_empresa;
	}

	public Date getData() {
		return data;
	}

	public double getPercentagem() {
		return percentagem;
	}

	public void setPercentagem(final double percentagem) {
		this.percentagem = percentagem;
	}

	public void gravaParaBaseDeDados() throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException {
		Comparticipacao.altera(toHashtable());
	}

	public Hashtable<String, Object> toHashtable() {

		Hashtable<String, Object> dados_comparticipacao = new Hashtable<String, Object>();

		dados_comparticipacao.put("var_id_servico", new Integer(this.getIdServico()));
		dados_comparticipacao.put("var_id_empresa", this.getIdEmpresa());
		dados_comparticipacao.put("var_percentagem", this.getPercentagem());
		dados_comparticipacao.put("var_data", this.getData());

		return dados_comparticipacao;
	}

	// Atributos
	private int id_servico, id_empresa;
	private double percentagem;
	private Date data;
}
